using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
using objetos;
using dados;
using System.Transactions;
using publico;

namespace negocios
{
	#region TB_ORDEM_PRODUCAO_ITEM
	/// <summary>
	/// This object represents the properties and methods of a TB_ORDEM_PRODUCAO_ITEM.
	/// </summary>
	public class BLL_TB_ORDEM_PRODUCAO_ITEM
	{		
		DAL_TB_ORDEM_PRODUCAO_ITEM DAL = new DAL_TB_ORDEM_PRODUCAO_ITEM();
		
		#region METODOS PROCEDURES
		/// <summary>
		/// Incluir via procedure
		/// </summary>
		public int Incluir(OBJ_TB_ORDEM_PRODUCAO_ITEM obj)
		{
            try
            {       
                // estoque movimento
                BLL_TB_ESTOQUE_MOVIMENTO b_tb_estoque_movimento = new BLL_TB_ESTOQUE_MOVIMENTO();
                OBJ_TB_ESTOQUE_MOVIMENTO o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

                // ordem producao
                BLL_TB_ORDEM_PRODUCAO b_tb_ordem_producao = new BLL_TB_ORDEM_PRODUCAO();
                OBJ_TB_ORDEM_PRODUCAO o_tb_ordem_producao = new OBJ_TB_ORDEM_PRODUCAO();

                //  estoque tipo movimento
                BLL_TB_ESTOQUE_TIPO_MOVIMENTO b_tb_estoque_tipo_movimento = new BLL_TB_ESTOQUE_TIPO_MOVIMENTO();
                OBJ_TB_ESTOQUE_TIPO_MOVIMENTO o_tb_estoque_tipo_movimento = new OBJ_TB_ESTOQUE_TIPO_MOVIMENTO();

                // ordem producao historico

                BLL_TB_ORDEM_PRODUCAO_HISTORICO b_tb_ordem_producao_historico = new BLL_TB_ORDEM_PRODUCAO_HISTORICO();
                OBJ_TB_ORDEM_PRODUCAO_HISTORICO o_tb_ordem_producao_historico = new OBJ_TB_ORDEM_PRODUCAO_HISTORICO();



                o_tb_ordem_producao = b_tb_ordem_producao.SelecionarObjetoPorId(obj.id_ordem_producao);              

                List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_estoque_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();
          
                int id_ordem_producao_item = 0;

                using (TransactionScope scope = new TransactionScope())
                {
                    // INCLUIR ITEM
                    id_ordem_producao_item = DAL.Incluir(obj);


                    // FAZ O MOVIMENTO DE SAIDA
                    o_tb_estoque_movimento.id_empresa = o_tb_ordem_producao.id_empresa;               
                    o_tb_estoque_movimento.id_produto = obj.id_produto_servico;
                    o_tb_estoque_movimento.id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.PRODUCAO;
                    o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                    o_tb_estoque_movimento.qtd_entrada = 0;
                    o_tb_estoque_movimento.qtd_saida = obj.qtd;
                    o_tb_estoque_movimento.sigla_movimento = lista_estoque_tipo_movimento.Find((sigla) => sigla.id == o_tb_estoque_movimento.id_tipo_movimento).sigla.ToString();
                    o_tb_estoque_movimento.valor_compra = 0;
                    o_tb_estoque_movimento.valor_venda = obj.valor_unitario;
                    o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
                    b_tb_estoque_movimento.Incluir(o_tb_estoque_movimento);


                    // INCLUIR O HISTORICO

                    o_tb_ordem_producao_historico.desc_ordem_producao_historico = string.Format("Login {0} incluiu o item ID {1}", PUB_SESSAO.Login, obj.id_produto_servico);
                    o_tb_ordem_producao_historico.dt_atualizacao = DateTime.Now;
                    o_tb_ordem_producao_historico.id_ordem_producao = obj.id;
                    o_tb_ordem_producao_historico.id_usuario = PUB_SESSAO.Id;
                    b_tb_ordem_producao_historico.Incluir(o_tb_ordem_producao_historico);

                    scope.Complete();



                }

                return id_ordem_producao_item;
			
            }
            catch (Exception)
            {
                
                throw;
            }
           
		}
		
		/// <summary>
		/// Alterar via procedure
		/// </summary>
		public void Alterar(OBJ_TB_ORDEM_PRODUCAO_ITEM obj)
		{
			DAL.Alterar(obj);	
		}

        public bool ExisteItem(int id_ordem_producao)
        {

            if (DAL.SelecionarLista(string.Format("tb_ordem_producao_item.id_ordem_producao = {0}", id_ordem_producao), "").Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        public bool ExisteItem(int id_ordem_producao, int id_produto_servico)
        {

            if (DAL.SelecionarLista(string.Format("tb_ordem_producao_item.id_ordem_producao = {0}", id_ordem_producao), "").Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

		/// <summary>
		/// Excluir via procedure
		/// </summary>
		public void Excluir(OBJ_TB_ORDEM_PRODUCAO_ITEM obj)
        {            
            int id_tipo_movimento = 0;

            try
            {
                // ORDEM PRODUCAO
                OBJ_TB_ORDEM_PRODUCAO o_tb_ordem_producao = new OBJ_TB_ORDEM_PRODUCAO();
                BLL_TB_ORDEM_PRODUCAO b_tb_ordem_producao = new BLL_TB_ORDEM_PRODUCAO();
    

                // ESTOQUE MOVIMENTO
                BLL_TB_ESTOQUE_MOVIMENTO b_tb_estoque_movimento = new BLL_TB_ESTOQUE_MOVIMENTO();
                OBJ_TB_ESTOQUE_MOVIMENTO o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

                // TIPO MOVIMENTO 
                BLL_TB_ESTOQUE_TIPO_MOVIMENTO b_tb_estoque_tipo_movimento = new BLL_TB_ESTOQUE_TIPO_MOVIMENTO();
                OBJ_TB_ESTOQUE_TIPO_MOVIMENTO o_tb_estoque_tipo_movimento = new OBJ_TB_ESTOQUE_TIPO_MOVIMENTO();

                OBJ_TB_ORDEM_PRODUCAO_HISTORICO o_tb_ordem_producao_historico = new OBJ_TB_ORDEM_PRODUCAO_HISTORICO();
                BLL_TB_ORDEM_PRODUCAO_HISTORICO b_tb_ordem_producao_historico = new BLL_TB_ORDEM_PRODUCAO_HISTORICO();

                o_tb_ordem_producao = b_tb_ordem_producao.SelecionarObjetoPorId(obj.id_ordem_producao);


                List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();

                id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.CONSUMOINTERNO;

                using (TransactionScope scope = new TransactionScope())
                {
                    // EXCLUIR O ITEM
                    DAL.Excluir(obj);

                    o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();

                    o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
                    o_tb_estoque_movimento.id_empresa = o_tb_ordem_producao.id_empresa;
                    o_tb_estoque_movimento.id_produto = obj.id_produto_servico;
                    o_tb_estoque_movimento.id_tipo_movimento = id_tipo_movimento;
                    o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                    o_tb_estoque_movimento.qtd_entrada = obj.qtd;
                    o_tb_estoque_movimento.qtd_saida = 0;
                    o_tb_estoque_movimento.sigla_movimento = lista_tipo_movimento.Find((tipo) => tipo.id == id_tipo_movimento).sigla.ToString();
                    o_tb_estoque_movimento.valor_compra = obj.valor_unitario;
                    o_tb_estoque_movimento.valor_venda = 0;
                    b_tb_estoque_movimento.Incluir(o_tb_estoque_movimento);

                    o_tb_ordem_producao_historico.id_ordem_producao = obj.id_ordem_producao;
                    o_tb_ordem_producao_historico.id_usuario = PUB_SESSAO.Id;
                    o_tb_ordem_producao_historico.desc_ordem_producao_historico = string.Format("Login: {0} excluiu item ID: {1}", PUB_SESSAO.Login, obj.id_produto_servico);
                    o_tb_ordem_producao_historico.dt_atualizacao = DateTime.Now;
                    b_tb_ordem_producao_historico.Incluir(o_tb_ordem_producao_historico);

                    scope.Complete();
                }

            }
            catch (Exception)
            {
                
                throw;
            }

          

         
		}
		
		/// <summary>
		/// Excluir Lista via procedure
		/// </summary>
		public void ExcluirLista(List<OBJ_TB_ORDEM_PRODUCAO_ITEM> lista)
		{
				foreach (OBJ_TB_ORDEM_PRODUCAO_ITEM obj in lista)
            	{
                this.Excluir(obj);
            	}
			
		}
						
		/// <summary>
		/// Pesquisar Parametros Where, OrderBy, PageIndex, PageSize
		/// </summary>		
		public DataSet Selecionar(string Where, string OrderBy, int PageIndex, int PageSize)
		{
			
			return DAL.Selecionar(Where,OrderBy,PageIndex,PageSize);
			
		}		
		
		
		/// <summary>
		/// Retorna Objeto por ID
		/// </summary>
		public OBJ_TB_ORDEM_PRODUCAO_ITEM SelecionarObjetoPorId(int id)
		{
			return DAL.SelecionarObjetoPorId(id);
			
		}
				
			
		/// <summary>
		/// Retorna DataSet Parametros Where, OrderBy
		/// </summary>	
		public DataSet Selecionar(String Where, String OrderBy)
        {
            return DAL.Selecionar(Where, OrderBy);
        }
		
		/// <summary>
		/// Retorna DataSet
		/// </summary>	
		public DataSet Selecionar()
        {
            return DAL.Selecionar();
        }
			
		
		/// <summary>
		/// Retorna uma lista de objetos por parametro Where, OrderBy
		/// </summary>
		public List<OBJ_TB_ORDEM_PRODUCAO_ITEM>SelecionarLista(String Where, String OrderBy)
		{						
			return 	DAL.SelecionarLista(Where,OrderBy);
		}
		
		        

        public Decimal ValorTotal(int id_ordem_producao)
        {
            return DAL.ValorTotal(id_ordem_producao);
        }


		/// <summary>
		/// Retorna uma lista de objetos por parametro 
		/// </summary>
		public List<OBJ_TB_ORDEM_PRODUCAO_ITEM>SelecionarLista()
		{						
			return 	DAL.SelecionarLista();
		}
		
		public void PreencheControle(System.Web.UI.Control controle, bool selecione)
        {
            if (controle is DropDownList)
            {
                DropDownList ddl = (DropDownList)controle;
                ddl.Items.Clear();
                foreach (OBJ_TB_ORDEM_PRODUCAO_ITEM obj in DAL.SelecionarLista())
                {
                    ddl.Items.Add(new ListItem(obj.id_ordem_producao.ToString(), obj.id.ToString()));
                }
                
                if (selecione)
                {
                    ddl.Items.Insert(0, new ListItem("Selecione", ""));
                    ddl.SelectedIndex = 0;
                }

                ddl.DataBind();
            }


            if (controle is ListBox)
            {
                ListBox lst = (ListBox)controle;
                lst.Items.Clear();
                foreach (OBJ_TB_ORDEM_PRODUCAO_ITEM obj in DAL.SelecionarLista())
                {
                    lst.Items.Add(new ListItem(obj.id_ordem_producao.ToString(), obj.id.ToString()));
                }

                if (selecione)
                {
                    lst.Items.Insert(0, new ListItem("Selecione", ""));
                    lst.SelectedIndex = 0;
                }

                lst.DataBind();
            }

        }										
			
		
		public DataSet ListaCampos()
		{
			 return DAL.ListaCampos();
		}
					
		#endregion
	}
	#endregion
}

